/**
在 TypeScript 中，函数中的  this  默认类型是一个重要的概念，它影响着函数的上下文和调用方式。
  1.  this  的默认类型

  在 TypeScript 中，普通函数的  this  默认类型是  any 。这意味着如果没有明确指定  this  的类型，TypeScript 不会对  this  的使用进行类型检查。

   示例：
  function showThis() {
      console.log(this); // this 的类型是 any
  }

  showThis(); // 输出: window (在浏览器中)
  2. 函数中的  this  类型

  为了更好地控制  this  的类型，可以在函数的类型定义中显式指定  this  的类型。可以使用  this  关键字来表示当前上下文的类型。

   示例：
  interface Person {
      name: string;
      greet(this: Person): void; // 指定 this 的类型为 Person
  }

  const person: Person = {
      name: "Alice",
      greet: function(this: Person) {
          console.log(Hello, my name is ${this.name});
      }
  };

  person.greet(); // 输出: Hello, my name is Alice
  3. 箭头函数中的  this 

  在箭头函数中， this  的值是从外部上下文中继承的，而不是根据调用方式来决定。这使得箭头函数在处理  this  时更加灵活。

   示例：
  const person = {
      name: "Bob",
      greet: function() {
          const innerFunction = () => {
              console.log(Hello, my name is ${this.name}); // this 继承自 greet 方法
          };
          innerFunction();
      }
  };

  person.greet(); // 输出: Hello, my name is Bob
  4. 使用  this  的注意事项

  - **避免  any  类型**：在使用  this  时，尽量避免使用  any  类型，以保持类型安全。
  - **明确指定  this  类型**：在需要明确  this  上下文的情况下，使用接口或类型别名来指定  this  的类型。
  - **箭头函数**：在需要访问外部上下文的  this  时，可以使用箭头函数。

  5. 结论

  在 TypeScript 中，函数中的  this  默认类型是  any ，但可以通过显式指定  this  的类型来增强类型安全。合理使用  this  的类型定义可以帮助开发者更好地控制函数的上下文，避免潜在的错误。在实际开发中，建议明确指定  this  的类型，尤其是在复杂的对象和类中，以提高代码的可读性和可维护性。
 */
// 在没有对TS进行特殊配置的情况下, this是any类型
// 1.对象中的函数中的this
const obj = {
  name: 'this-name',
  runing: function () {
    // 默认情况下, this是any类型
    console.log(this.name.length, "runing")
  }
}

obj.runing()
// obj.studying.call({})

// 2.普通的函数
function foo() {
  console.log(this);
}

export {}